#!/usr/bin/env python
#coding=utf-8
#refer to:http://www.cnblogs.com/eineseite/archive/2009/07/02/1515388.html
#         http://mail.python.org/pipermail/python-win32/2004-September/002305.html
# SmallestService.py
#
# A sample demonstrating the smallest possible service written in Python.
#命令行下运行：SmallestService.py install      就作为服务安装了
#               win32_installservice.py remove  就可以卸载该服务

import win32serviceutil
import win32service
import win32event
import wmi_sysservice

class SmallestPythonService(win32serviceutil.ServiceFramework):
    _svc_name_ = "SmallestPythonService"
    _svc_display_name_ = "The smallest possible Python Service"
    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        # Create an event which we will use to wait on.
        # The "service stop" request will set this event.
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)

    def SvcStop(self):
        # Before we do anything, tell the SCM we are starting the stop process.
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        # And set my event.
        win32event.SetEvent(self.hWaitStop)

    def SvcDoRun(self):
        self.timeout=5*1000      #sleep 5 seconds
        # 把你的程序代码放到这里就OK了
        while 1:
            if win32event.WaitForSingleObject(self.hWaitStop, self.timeout) == win32event.WAIT_OBJECT_0:
                break
            wmi_sysservice.main()
'''
这里发现个问题，实际使用时最好是如下这样的方式。
这里的run模块是需要运行的模块，如果run模块里的操作需要读取比如当前目录下的配置文件，则需要os.chdir进入模块目录。
否则记录os.getcwd())会发现当前目录在C:\Python32\Lib\site-packages\win32下，导致一些对当前目录下的操作失败。
另外就是if超时的判断放在后面，这样就可以先运行一次应用再等待self.timemout指定的超时时间。
        self.timeout=10*60*1000
        while 1:
            appdir=os.path.split(run.__file__)[0]
            os.chdir(appdir)
            run.run()
            if win32event.WaitForSingleObject(self.hWaitStop, self.timeout) == win32event.WAIT_OBJECT_0:
                break
今天再记录一笔：如果修改了本脚本，那么需要卸载该服务再安装；如果修改的是wmi_sysservice.main调用里涉及到的则不需要卸载再安装。python3.2中是这样。
'''
        #win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)

if __name__=='__main__':
    win32serviceutil.HandleCommandLine(SmallestPythonService)
    # 括号里的名字可以改成其他的，必须与class名字一致；
